package com.kongfuzi.proxy;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

//要代理的业务对象
class ProductMangerImpl {
    public ProductMangerImpl() {
        System.out.println("创建ProductMangerImpl对象");
    }
    public int addProduct() {
        System.out.println("执行添加商品");
        return 1;
    }
    //该方法不能被子类覆盖,Cglib是无法代理final修饰的方法
    public final int deleteProduct(int no) {
        System.out.println("执行删除商品..."+no);
        return 1001;
    }
}
//实现MethodInterceptor接口的方法拦截器: jdk:InvocationHandle
class MyMethodInterceptor implements MethodInterceptor {
    /**
     * obj：cglib生成的代理对象
     * method：被代理对象方法
     * args：方法入参
     * methodProxy: 代理方法
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("调用方法之前====前置通知=====");
        Object result = methodProxy.invokeSuper(obj, args);
        System.out.println("调用方法之后====后置通知=====");
        return result;
    }

}
public class CGLibDemo {
    public static void main(String[] args) {
        // 指定代理类字节码文件的路径
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/kongfanyu/Documents/cglib");
        // 通过CGLIB动态代理获取代理对象的过程
        Enhancer enhancer = new Enhancer();
        // 设置enhancer的父类
        enhancer.setSuperclass(ProductMangerImpl.class);
        // 设置enhancer的回调对象
        enhancer.setCallback(new MyMethodInterceptor());
        // 创建代理对象
        ProductMangerImpl proxy = (ProductMangerImpl) enhancer.create();
        System.out.println("代理类的名称:"+proxy.getClass().getName());
        //通过代理对象调用目标方法
        proxy.addProduct();//带日志
        int result = proxy.deleteProduct(1);//不带日志
        System.out.println(result);
    }
}
